

package ru.samgtu.wst.ui.swing;

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.table.AbstractTableModel;

import ru.samgtu.wst.model.Preferences;
import ru.samgtu.wst.plugin.BasicCredential;
import ru.samgtu.wst.plugin.CredentialManager;
import ru.samgtu.wst.plugin.DomainCredential;


public class CredentialManagerFrame extends javax.swing.JFrame {

	private CredentialManager _manager;
	private BasicTableModel _btm;
	private DomainTableModel _dtm;

	/** Creates new form CredentialManagerFrame */
	public CredentialManagerFrame(CredentialManager manager) {
		initComponents();
		boolean prompt = Boolean.valueOf(
				Preferences.getPreference("WST.promptForCredentials",
						"false")).booleanValue();
		promptCheckBox.setSelected(prompt);
		addComponentListener(new Updater());
		_manager = manager;
		_btm = new BasicTableModel();
		_dtm = new DomainTableModel();
		basicTable.setModel(_btm);
		domainTable.setModel(_dtm);
	}

	private void updateCredentials() {
		_btm.fireTableDataChanged();
		_dtm.fireTableDataChanged();
	}

	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always
	 * regenerated by the Form Editor.
	 */
	// <editor-fold defaultstate="collapsed"
	// desc=" Generated Code ">//GEN-BEGIN:initComponents
	private void initComponents() {
		java.awt.GridBagConstraints gridBagConstraints;

		jLabel1 = new javax.swing.JLabel();
		jScrollPane1 = new javax.swing.JScrollPane();
		basicTable = new javax.swing.JTable();
		jLabel2 = new javax.swing.JLabel();
		jScrollPane2 = new javax.swing.JScrollPane();
		domainTable = new javax.swing.JTable();
		jPanel1 = new javax.swing.JPanel();
		addButton = new javax.swing.JButton();
		deleteButton = new javax.swing.JButton();
		clearButton = new javax.swing.JButton();
		closeButton = new javax.swing.JButton();
		promptCheckBox = new javax.swing.JCheckBox();

		getContentPane().setLayout(new java.awt.GridBagLayout());

		setTitle("WST Credentials");
		jLabel1.setText("Basic Credentials");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 0;
		gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
		getContentPane().add(jLabel1, gridBagConstraints);

		basicTable.setModel(new javax.swing.table.DefaultTableModel(
				new Object[][] { { null, null, null, null },
						{ null, null, null, null }, { null, null, null, null },
						{ null, null, null, null } }, new String[] { "Title 1",
						"Title 2", "Title 3", "Title 4" }));
		jScrollPane1.setViewportView(basicTable);

		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 1;
		gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
		gridBagConstraints.weightx = 1.0;
		gridBagConstraints.weighty = 1.0;
		getContentPane().add(jScrollPane1, gridBagConstraints);

		jLabel2.setText("Domain Credentials");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 2;
		gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
		getContentPane().add(jLabel2, gridBagConstraints);

		domainTable.setModel(new javax.swing.table.DefaultTableModel(
				new Object[][] { { null, null, null, null },
						{ null, null, null, null }, { null, null, null, null },
						{ null, null, null, null } }, new String[] { "Title 1",
						"Title 2", "Title 3", "Title 4" }));
		jScrollPane2.setViewportView(domainTable);

		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 3;
		gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
		gridBagConstraints.weightx = 1.0;
		gridBagConstraints.weighty = 1.0;
		getContentPane().add(jScrollPane2, gridBagConstraints);

		addButton.setText("Add");
		addButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				addButtonActionPerformed(evt);
			}
		});

		jPanel1.add(addButton);

		deleteButton.setText("Delete");
		deleteButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				deleteButtonActionPerformed(evt);
			}
		});

		jPanel1.add(deleteButton);

		clearButton.setText("Clear all");
		clearButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				clearButtonActionPerformed(evt);
			}
		});

		jPanel1.add(clearButton);

		closeButton.setText("Close");
		closeButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				closeButtonActionPerformed(evt);
			}
		});

		jPanel1.add(closeButton);

		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 5;
		getContentPane().add(jPanel1, gridBagConstraints);

		promptCheckBox.setText("Ask when required");
		promptCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0,
				0, 0, 0));
		promptCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
		promptCheckBox.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				promptCheckBoxActionPerformed(evt);
			}
		});

		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 4;
		gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
		gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
		getContentPane().add(promptCheckBox, gridBagConstraints);

		java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit()
				.getScreenSize();
		setBounds((screenSize.width - 400) / 2, (screenSize.height - 300) / 2,
				400, 300);
	}// </editor-fold>//GEN-END:initComponents

	private void promptCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_promptCheckBoxActionPerformed
		Preferences.setPreference("WST.promptForCredentials", Boolean
				.toString(promptCheckBox.isSelected()));
	}// GEN-LAST:event_promptCheckBoxActionPerformed

	private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_clearButtonActionPerformed
		for (int i = _manager.getBasicCredentialCount() - 1; i >= 0; i--) {
			_manager.deleteBasicCredentialAt(i);
		}
		for (int i = _manager.getDomainCredentialCount() - 1; i >= 0; i--) {
			_manager.deleteDomainCredentialAt(i);
		}
		updateCredentials();
	}// GEN-LAST:event_clearButtonActionPerformed

	private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_closeButtonActionPerformed
		setVisible(false);
	}// GEN-LAST:event_closeButtonActionPerformed

	private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_deleteButtonActionPerformed
		int basicSelection = basicTable.getSelectedRow();
		int domainSelection = domainTable.getSelectedRow();
		if ((basicSelection > -1) && (domainSelection > -1)) {
			return;
		}
		if (basicSelection > -1) {
			_manager.deleteBasicCredentialAt(basicSelection);
		}
		if (domainSelection > -1) {
			_manager.deleteDomainCredentialAt(domainSelection);
		}
		updateCredentials();
	}// GEN-LAST:event_deleteButtonActionPerformed

	private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_addButtonActionPerformed
		new CredentialRequestDialog(this, true, _manager).requestCredentials(
				null, null);
		updateCredentials();
	}// GEN-LAST:event_addButtonActionPerformed

	// Variables declaration - do not modify//GEN-BEGIN:variables
	private javax.swing.JButton addButton;
	private javax.swing.JTable basicTable;
	private javax.swing.JButton clearButton;
	private javax.swing.JButton closeButton;
	private javax.swing.JButton deleteButton;
	private javax.swing.JTable domainTable;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JLabel jLabel2;
	private javax.swing.JPanel jPanel1;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JScrollPane jScrollPane2;
	private javax.swing.JCheckBox promptCheckBox;

	// End of variables declaration//GEN-END:variables

	private class BasicTableModel extends AbstractTableModel {

		private String[] _columnNames = { "Host", "Realm", "Username" };

		@Override
		public String getColumnName(int column) {
			return _columnNames[column];
		}

		public int getColumnCount() {
			return 3;
		}

		public int getRowCount() {
			return _manager.getBasicCredentialCount();
		}

		public Object getValueAt(int row, int column) {
			BasicCredential bc = _manager.getBasicCredentialAt(row);
			switch (column) {
			case 0:
				return bc.getHost();
			case 1:
				return bc.getRealm();
			case 2:
				return bc.getUsername();
			}
			return null;
		}

	}

	private class DomainTableModel extends AbstractTableModel {

		private String[] _columnNames = { "Host", "Domain", "Username" };

		@Override
		public String getColumnName(int column) {
			return _columnNames[column];
		}

		public int getColumnCount() {
			return 3;
		}

		public int getRowCount() {
			return _manager.getDomainCredentialCount();
		}

		public Object getValueAt(int row, int column) {
			DomainCredential dc = _manager.getDomainCredentialAt(row);
			switch (column) {
			case 0:
				return dc.getHost();
			case 1:
				return dc.getDomain();
			case 2:
				return dc.getUsername();
			}
			return null;
		}

	}

	private class Updater extends ComponentAdapter {
		@Override
		public void componentShown(ComponentEvent e) {
			updateCredentials();
		}
	}

}
